﻿using System;
using System.Data;

namespace Sgr.Domain.Uow
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false, Inherited = true)]
    public class UnitOfWorkAttribute : Attribute
    {
        /// <summary>
        /// 该工作单元是否是事务性的？
        /// 如果未提供，则使用默认值。
        /// </summary>
        public bool? IsTransactional { get; set; }

        /// <summary>
        /// 工作单元的超时时间（以毫秒为单位）。
        /// 如果未提供，则使用默认值。
        /// </summary>
        public int? Timeout { get; set; }

        /// <summary>
        /// 如果该工作单元是事务性的，则此选项指示事务的隔离级别。
        /// 如果未提供，则使用默认值。
        /// </summary>
        public IsolationLevel? IsolationLevel { get; set; }

        /// <summary>
        /// 用于防止为方法启动工作单元。
        /// 如果已经启动了一个工作单元，则忽略此属性。
        /// 默认值：false。
        /// </summary>
        public bool IsDisabled { get; set; }

        public UnitOfWorkAttribute(bool isTransactional)
        {
            IsTransactional = isTransactional;
        }

        public UnitOfWorkAttribute(bool isTransactional, IsolationLevel isolationLevel)
        {
            IsTransactional = isTransactional;
            IsolationLevel = isolationLevel;
        }

        public UnitOfWorkAttribute(bool isTransactional, IsolationLevel isolationLevel, int timeout)
        {
            IsTransactional = isTransactional;
            IsolationLevel = isolationLevel;
            Timeout = timeout;
        }

        /// <summary>
        /// 设置工作单元选项。
        /// </summary>
        /// <param name="options">工作单元选项。</param>
        public virtual void SetOptions(UnitOfWorkOption options)
        {
            if (IsTransactional.HasValue)
            {
                options.IsTransactional = IsTransactional.Value;
            }

            if (Timeout.HasValue)
            {
                options.Timeout = Timeout;
            }

            if (IsolationLevel.HasValue)
            {
                options.IsolationLevel = IsolationLevel;
            }
        }
    }
}